#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <fcntl.h>

struct demo_msg {
    int fd;
    unsigned int size;
    unsigned int mapped;
    unsigned int iova;
    char name[32];
    unsigned int value;
    char data[128];
};

#define DEMO_IOCTL_IO _IO('d', 0x01)
#define DEMO_IOCTL_IOR _IOR('d', 0x02, int)
#define DEMO_IOCTL_IOW _IOW('d', 0x03, struct demo_msg)
#define DEMO_IOCTL_IOWR _IOWR('d', 0x04, struct demo_msg)

int main(int argc, char *argv[])
{
    int fd;
    int value = 0;
    ssize_t size;
    int ret;
    struct demo_msg msg;
    fd = open("/dev/dev-demo", O_RDWR);
    if (fd < 0) {
        printf("open demo device failed\n");
        return -1;
    }

    ret = ioctl(fd, DEMO_IOCTL_IO);
    ret = ioctl(fd, DEMO_IOCTL_IOR, &msg);
    if (ret) {
        printf("[line]: %d, DEMO_IOCTL_IOR error, ret = %d\n", __LINE__, ret);
        return -1;
    }
    printf("name = %s, value = %d, data = %s\n", msg.name, msg.value, msg.data);

    strncpy(msg.name, "userapp", strlen("userapp") + 1);
    msg.value = 0;
    strncpy(msg.name, "clean data", strlen("clean data") + 1);
    ret = ioctl(fd, DEMO_IOCTL_IOW, &msg);
    if (ret) {
        printf("[line]: %d, DEMO_IOCTL_IOW error, ret = %d\n", __LINE__, ret);
        return -1;
    }

    ret = ioctl(fd, DEMO_IOCTL_IOWR, &msg);
    if (ret) {
        printf("[line]: %d, DEMO_IOCTL_IOWR error, ret = %d\n", __LINE__, ret);
        return -1;
    }
    printf("name = %s, value = %d, data = %s\n", msg.name, msg.value, msg.data);

    close(fd);
    return 0;
}
